home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
050
/
convert.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-02-22
|
7KB
|
211 lines
PROGRAM PROG4(INPUT,OUTPUT);
(****************************************************************)
(* *)
(* WRITTEN BY: PETER J. KINSELLA *)
(* MOORHEAD MN (218) 233-8467 *)
(* 1/12/87 *)
(* *)
(* *)
(* THIS PROGRAM WILL CONVERT INTEGERS BETWEEN ANY TWO *)
(* BASES SPECIFIED BY THE USER. *)
(* *)
(* *)
(* INPUT: *)
(* WILL CONSIST OF A SEQENCE OF LINES, EACH LINE HAVING A *)
(* SERIES OF NUMBERS ON IT, THE FIRST NUMBER (WHICH MUST BE *)
(* LESS THEN 16) IS THE BASE (B1) THE PROGRAM IS TO CONVERT *)
(* FROM, FOLLOWED BY AT LEAST ONE BLANK AND A SECOND NUMBER *)
(* (ALSO LESS THEN 16) THE PROGRAM WILL CONVERT TO (B2). *)
(* THESE TWO NUMBERS MUST BE FOLLOWED BUY AT LEAST ONE *)
(* BLANK AND THEN A SEQUENCE OF CONSECUTIVE NON-BLANK *)
(* CHARACTERS WILL FOLLOW REPRESENTING THE VALUE OF THE BASE *)
(* TO BE CONVERTED. *)
(* *)
(* *)
(* OUTPUT: *)
(* FOR EACH LINE OF INPUT AN OUT PUT LINE WILL BE WRITTEN *)
(* SHOWING THE TWO BASES BEING CONVERTED BETWEEN ALONG WITH *)
(* THE ORIGINAL AND CONVERTED VALUE OF THE NUMBER, OR SOME *)
(* ERROR STATMENT GIVING SOME INDICATION AS TO WHY THE VALUE *)
(* COULD NOT BE PROCESSED. *)
(* *)
(* *)
(* ASSUMPTIONS: *)
(* 1. NO BASE WILL BE, OR CONVERTED TO LARGER THEN BASE 16 *)
(* 2. NO NONE ALPHA-NUMERIC CHARACTERS WILL BE IN THE *)
(* INPUT FILE. *)
(* 3. FOR LARGER THAN BASE 10 CONVERSIONS THIS PROGRAM *)
(* SHOULD BE RUN ON AN EBCDIC OPERATING SYSTEM. *)
(* *)
(****************************************************************)
VAR
BASE1: INTEGER; (* VALUE OF BASE CONVERTING FROM *)
BASE2: INTEGER; (* VALUE OF BASE CONVERTING TO *)
SUM: INTEGER;
CH: CHAR;
FLAG: BOOLEAN; (* FALSE IF ERROR IN INPUT DATA *)
FUNCTION VALUE(VAR CH: CHAR) : INTEGER;
(*******************************************************)
(* RETURNS BASE TEN EQUIVELENT OF NUMBER UP THROUGH F *)
(*******************************************************)
BEGIN (* VALUE *)
VALUE:= ORD(CH) - ORD('0');
IF (CH < '0' ) THEN
VALUE:= (ORD(CH) - ORD('A')) + 10;
END; (* VALUE *)
PROCEDURE TEST(VAR CH:CHAR; VAR BASE1,SUM:INTEGER; VAR FLAG:BOOLEAN);
(*******************************************************)
(* CHECKS TO MAKE SURE CHARACTER IS A VALID NUMERIC *)
(* INDICATOR. *)
(*******************************************************)
BEGIN (* TEST *)
IF ((MAXINT/(SUM+1)) > VALUE(CH)) THEN
FLAG :=FALSE;
IF ((VALUE(CH) < BASE1) AND (VALUE(CH) >= 0)) THEN
FLAG := TRUE
ELSE
BEGIN
WRITE('*** DATA ERROR ***');
FLAG := FALSE;
WHILE CH <> ' ' DO
READ(CH);
END;
END; (* TEST *)
PROCEDURE BASE10(VAR CH:CHAR; VAR BASE1, SUM:INTEGER; VAR FLAG:BOOLEAN);
(*******************************************************)
(* CONVERTS A STIRING OF CHARACTERS TO BASE 10 *)
(* EQUIVALENT THROUGH 'F' *)
(*******************************************************)
BEGIN (* BASE10 *)
WHILE (CH <> ' ') DO
BEGIN
TEST(CH,BASE1,SUM,FLAG);
IF (FLAG) THEN
BEGIN
WRITE (CH);
SUM:= SUM * BASE1 + VALUE(CH);
READ (CH);
END
END;
END; (* BASE10 *)
PROCEDURE CONVERT(VAR NUM, B2: INTEGER);
(*******************************************************)
(* THIS PROCEDURE CONVERTS BASE 10 NUMBER'S TO BASE *)
(* 'B2' NUMBERS. *)
(*******************************************************)
VAR
I : INTEGER; (* INDEX VARIABLE *)
DIGIT: INTEGER; (* DIGIT IN BASE 'B2' *)
FUNCTION POWER(VAR X, N :INTEGER):INTEGER;
(********************************************************)
(* THIS FUNCTION RAISES THE BASE 'X' TO THE POWER 'N' *)
(********************************************************)
VAR
SUM, COUNT: INTEGER;
BEGIN (* POWER *)
SUM := 1;
COUNT := 1;
WHILE COUNT <= N DO
BEGIN
SUM := SUM * X;
COUNT := COUNT + 1
END;
POWER := SUM
END; (* POWER *)
BEGIN (* CONVERT *)
I:= 0;
WHILE (NOT(POWER(B2,I) > NUM)) DO
I := I + 1;
WHILE I >= 1 DO
BEGIN
I := I - 1;
DIGIT := NUM DIV POWER(B2,I);
NUM := NUM MOD POWER(B2,I);
WRITE(DIGIT:1);
END;
WRITELN;
END; (* CONVERT *)
BEGIN (* PROG4 *)
WHILE NOT EOF DO
BEGIN
FLAG := TRUE;
SUM := 0;
READ(BASE1,BASE2);
WRITE('BASE ',BASE1:2,' REPRESENTATION ');
READ(CH);
WHILE ((CH = ' ') AND (NOT EOF)) DO
READ(CH);
BASE10(CH, BASE1, SUM, FLAG);
IF (FLAG) THEN
BEGIN
WRITE(' BASE ',BASE2:2,' REPRESENTATION ');
CONVERT(SUM, BASE2);
END;
END;
END. (* PROG4 *)